package Java比较器;

import org.junit.Test;

import java.util.Arrays;
import java.util.Comparator;

/*
    定制排序:java.util.Comparator
         当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,
           或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那
           么可以考虑使用 Comparator的对象来排序,强行对多个对象进行整体排序
           序的比较
         重写compare(Object o1,Object o2)方法,比较o1和o2的大小:
            如果方法返回正整数,则表示o1大于o2
            如果返回0,表示相等
            返回负整数,表示o1小于o2
         可以将 Comparator传递给 sort方法(如 Collections.sort或 Arrays.sort)
           从而允许在排序顺序上实现精确控制
         还可以使用 Comparator来控制某些数据结构(如有序 set或有序映射)的顺序,
           或者为那些没有自然顺序的对象 collection提供排序
 */
public class CompareTest02 {

    @Test
    public void test1(){
        String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};

        Arrays.sort(arr, new Comparator<String>() {
            //指定排序方式  --> 按照字段串从大到小的顺序排列
            @Override
            public int compare(String o1, String o2) {
                if(o1 instanceof String && o2 instanceof String){
                    String s1 = (String)o1;
                    String s2 = (String)o2;
                    return -s1.compareTo(s2);
                }
                throw new RuntimeException("输入数据的类型不一致!");
            }
        });

        System.out.println(Arrays.toString(arr));
    }

    @Test
    public void test2(){
        Goods[] arr = new Goods[4];
        arr[0] = new Goods("联想",3000);
        arr[1] = new Goods("戴尔",5000);
        arr[2] = new Goods("小米",4000);
        arr[3] = new Goods("惠普",6000);

        //指定排序方式 --> 先按照产品名称从低到高,再按照价格从高到低
        Arrays.sort(arr, new Comparator<Goods>() {
            @Override
            public int compare(Goods o1, Goods o2) {
                if(o1.getName().equals(o2.getName())){
                    return -Double.compare(o1.getPrice(),o2.getPrice());
                }else {
                    return o1.getName().compareTo(o2.getName());
                }
            }
        });

        System.out.println(Arrays.toString(arr));
    }
}
